XSS攻击原理、示例和防范措施

您所在的位置:网站首页 xss 防范 XSS攻击原理、示例和防范措施

XSS攻击原理、示例和防范措施

#XSS攻击原理、示例和防范措施 | 来源: 网络整理| 查看: 265

XSS攻击

XSS(Cross-Site Scripting,跨站脚本)攻击历史悠久,是危害范围非常广的攻击方式。

Cross-Site Stripting的缩写本应该是CSS,但是为了避免和Cascading style sheets(层叠样式表)的缩写混淆,所以将Cross(即交叉)使用交叉形状的X表示。

攻击原理

XSS是注入攻击的一种,攻击者通过将代码注入被攻击者的网站中,用户一旦访问访问网页便会执行被注入的恶意脚本。XSS攻击主要分为反射性XSS攻击(Reflected XSS attack)和存储型XSS攻击(Stored XSS Attack)两类。

 

攻击示例 反射型XSS(非持久型)

反射性XSS有称为非持久型XSS(Non-Persistent XSS)。当某个站点存在XSS漏洞时,这种攻击会通过URL注入攻击脚本,只有当用户访问这个URL是才会执行攻击脚本。

例如:

@app.route('/hello1') def hello1():     name = request.args.get('name')     response = 'Hello, %s!' %name

这个视图函数接收用户通过查询字符串(URL后边的参数)传入的数据,未做任何处理就把它直接插入到返回的响应主题中,返回给客户端。如果某个用户输入了一段JavaScript代码作为查询参数name的值:

http://127.0.0.1:5000/hello4?name=alert('Bingo!')

那么客户端收到的响应将变成下面的代码:

Hello,alert(‘Gingo!’)!

当客户端收到响应后,浏览器解析这行代码就会打开一个弹窗,下图是firefox浏览器(55.0版本)上的响应。

 

在chrome 72.0版本上的响应:

 

下面在IE11上的响应。

可见针对跨站攻击,某些浏览器已经做了安全防范。

不要觉得一个小弹窗不会造成什么危害,能够执行alert()函数就意味着通过这种方式可以执行任务JS代码。即攻击者通过javaScript几乎可以做任何事情:窃取用户的cookie和其他敏感数据,重定向到钓鱼网站,发送其他请求,执行注入转账、发布广告信息、在社交网站关注某个用户等。

即使不插入js代码,通过HTML和XSS注入也可以影响页面正常的输出,篡改页面样式,插入图片等。

如果网站A存在XSS漏洞,攻击者将包含攻击代码的链接发送给网站A的用户Foo,当Foo访问这个链接时就会执行攻击代码,从而受到攻击。

存储型XSS(持久型)

存储型XSS也被称为持久型XSS(persistent XSS),这种类型的XSS攻击更常见,危害也更大。它和反射型XSS类似,不过会把攻击代码存储到数据库中,任何用户访问包含攻击代码的页面都会被殃及。

比如,某个网站通过表单接收用户的留言,如果服务器接收数据后未经处理就存储到数据库中,那么用户可以在留言中出入任意javaScript代码。比如攻击者在留言中加入一行重定向代码:

window.location.href=”http://attacker.com”;

其他任意用户一旦访问关于这条留言的页面,包含这条留言的数据就会被浏览器解析,就会执行其中的javaScript脚本。那么这个用户所在页面就会被重定向到攻击者写入的站点。

防范措施 HTML转义

防范XSS攻击最主要的方法是对用户输入的内容进行HTML转义,转义后可以确保用户输入的内容在浏览器中作为文本显示,而不是作为代码解析。

这里的转义和python的概念相同,即消除代码执行时的歧义,也就是把变量标记的内容标记文本,而不是HTML代码。具体来说,这会把变量中与HTML相关的符号转换为安全字符,以避免变量中包含影响页面输出的HTML标签或恶意的javaScript代码。

比如,在flask中我们可以使用JinJa2提供的escape()函数对用户传入的数据进行转义:

 

from jinja2 import escape @app.route('/hello') def hello():     name = request.args.get('name')     response = 'Hello, %s!' %escape(name) return response

在Jinja2中,HTML转义相关的功能通过flask的依赖包MarkupSafe实现。

调用escape()并传入用户输入的数据,可以获得转义后的内容,前面的示例中,用户输入的javaScript代码将被转义为:

;script;alert('Bingo!');/script;

转义后,文本中的特殊字符(比如“>”和“



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3